home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 726-750 / 729 / bbbbs / bbbbs54.lzh / rexx / bbsREPORT.rexx < prev    next >
OS/2 REXX Batch file  |  1992-07-27  |  9KB  |  340 lines

  1. /*    $VER: 5.3 bbsREPORT.rexx 27 Jul 1992 (27.7.92)
  2.  
  3.                - reports user inactivity -
  4.        - any user who hasn't called for 365 days -
  5.    - less than 3 calls with last older than 270 days -
  6.        - only 1 call made more than 180 days ago -
  7.      - CHANGE THESE LIMITS IF YOU DON'T LIKE THEM! -
  8.  
  9.           - also will report filelist problems -
  10.  
  11. copyright 1991-92 Richard Lee Stockton FREELY DISTRIBUTABLE
  12. */
  13.  
  14. HOW_MANY=100    /* how many old files to put on report */
  15. MIN_DAYS=30     /* don't report files younger than this (in days) */
  16.  
  17. least.=999999999999
  18. CALL PRAGMA('P',-2)
  19.  
  20. SIGNAL ON ERROR
  21. SIGNAL ON SYNTAX
  22. SIGNAL ON FAILURE
  23. NUMERIC DIGITS 14
  24.  
  25. ARG name what2do 
  26. temp=STRIP(WORD(what2do,WORDS(what2do)))
  27. IF DATATYPE(temp,'N') THEN SMALLEST=temp
  28. ELSE SMALLEST=0
  29.  
  30. figarg='s:CONFIG.BBS'
  31. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  32. x=OPEN(f,figarg,'R')
  33. IF x=0 THEN
  34.   DO
  35.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  36.     EXIT(20)
  37.   END
  38.  
  39. lynes.=''
  40. DO i=1 TO 8
  41.   lynes.i=READLN(f)
  42. END
  43. CALL CLOSE(f)
  44.  
  45. compos=POS('/*',lynes.1)
  46. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  47.  
  48. bbsname = STRIP(lynes.1)
  49. sysop   = UPPER(WORD(lynes.2,1))
  50. bbspath = WORD(lynes.6,1)
  51. IF ~EXISTS(bbspath) THEN
  52.   DO
  53.     SAY bbspath 'does not exist!'
  54.     EXIT(20)
  55.   END
  56. testchar=RIGHT(bbspath,1)
  57. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  58.  
  59. libpath            = WORD(lynes.8,1)
  60. IF ~EXISTS(libpath) THEN
  61.   DO
  62.     MSG libpath 'does not exist!'
  63.     EXIT(20)
  64.   END
  65. testchar=RIGHT(libpath,1)
  66. IF testchar~='/' & testchar~=':' THEN libpath=libpath'/'
  67.  
  68.  
  69. IF FIND(what2do,'USERS')=0 THEN SIGNAL FILEREPORT
  70.  
  71. inarg=bbspath'EMail/'name'/INACTIVE_USERS'
  72. CALL CLOSE(STDOUT)
  73. CALL OPEN(STDOUT,inarg,'W')
  74. IF x=0 THEN
  75.   DO
  76.     SAY inarg 'would not open for writing!'
  77.     EXIT(20)
  78.   END
  79.  
  80. userlist=SHOWDIR(bbspath'Users','F')
  81. x=FIND(userlist,sysop)
  82. IF x>0 THEN userlist=DELWORD(userlist,x,1)
  83. SAY LEFT('USER_NAME',28)'days last_session calls location'
  84. DO i=1 TO WORDS(userlist)
  85.   thisuser=WORD(userlist,i)
  86.   x=OPEN(f,bbspath'Users/'thisuser,'R')
  87.   IF x=0 THEN
  88.     DO
  89.       SAY thisuser 'userfile would not open!'
  90.       ITERATE i
  91.     END
  92.   lynes.=''
  93.   DO j=1 TO 23
  94.     line=READLN(f)
  95.     IF EOF(f) THEN LEAVE j
  96.     lynes.j=line
  97.   END
  98.   CALL CLOSE(f)
  99.   idate=0
  100.   add2list=0
  101.   IF DATATYPE(WORD(lynes.13,1),'N') THEN
  102.     DO
  103.       idate=DATE('I',STRIP(WORD(lynes.13,1)),'S')
  104.       ndate=DATE('I')
  105.       IF FIND(lynes.21,'VIP_USER')>0 THEN NOP
  106.       ELSE IF (idate+365)<ndate THEN add2list=365
  107.       ELSE IF WORD(lynes.19,6)<4 & (idate+270)<ndate THEN add2list=270
  108.       ELSE IF WORD(lynes.19,6)<2 & (idate+180)<ndate THEN add2list=180
  109.       IF add2list>0 THEN
  110.         DO
  111.           line=LEFT(thisuser,28) RIGHT(add2list,3)'  'DATE(,WORD(lynes.13,1),'S')
  112.           line=line'  'WORD(lynes.19,6)'  'lynes.3
  113.           SAY line
  114.         END
  115.     END
  116.   ELSE SAY 'Bad Date!' thisuser lynes.13
  117. END
  118. IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=name THEN
  119.   CALL SETCLIP('BBS_MESSAGE','INACTIVE_USERS report is waiting in Email.')
  120.  
  121.  
  122.  
  123. FILEREPORT:
  124. IF FIND(what2do,'FILES')=0 THEN EXIT(0)
  125.  
  126. inarg=bbspath'EMail/'name'/FILELISTS_REPORT'
  127. CALL CLOSE(STDOUT)
  128. CALL OPEN(STDOUT,inarg,'W')
  129. IF x=0 THEN
  130.   DO
  131.     SAY inarg 'would not open for writing!'
  132.     EXIT(20)
  133.   END
  134.  
  135. SAY ' - FileReport -' DATE('W')'  'DATE()'  'TIME('C')
  136. SAY LEFT('-',75,'-')
  137.  
  138. dirs.='0000000'
  139. IF readopen(bbspath'Lists/Libraries') THEN
  140.   DO
  141.     DO i=1
  142.       line=READLN(f)
  143.       IF line='END' | EOF(f) THEN LEAVE i
  144.       num=WORD(line,1)
  145.       IF DATATYPE(num,'N') THEN dirs.num=STRIP(WORD(line,2))
  146.     END
  147.     CALL CLOSE(f)
  148.   END
  149.  
  150. problem=0
  151. IF readopen(bbspath'Lists/Files') THEN
  152.   DO
  153.     DO i=1
  154.       line=READLN(f)
  155.       IF EOF(f) THEN BREAK
  156.       realfile=libpath||COMPRESS(WORD(line,2)'/'WORD(line,3),' ')
  157.       IF EXISTS(realfile) THEN ITERATE i
  158.       link=STATEF(bbspath'FileNotes/'COMPRESS(WORD(line,2)'/'WORD(line,3)))
  159.       link=WORD(link,8)
  160.       IF link~='' THEN realfile=link
  161.       IF EXISTS(realfile) THEN ITERATE i
  162.       SAY realfile 'does not exist!'
  163.       problem=1
  164.     END
  165.     CALL CLOSE(f)
  166.   END
  167. IF ~problem THEN SAY 'All files in the master list exist as links or in the libraries.'
  168. ELSE SAY 'The above files in the master list are not available for downloading!'
  169. SAY i-1 'files listed in ''Lists/Files''.'
  170. k=0
  171. kk=0
  172. DO i=1 TO 99
  173.   IF dirs.i='' | dirs.i='0000000' THEN ITERATE i
  174.   realfiles=SHOWDIR(libpath||dirs.i)
  175.   k=k+WORDS(realfiles)
  176.   DO j=1 TO WORDS(realfiles)
  177.     DO
  178.       file=dirs.i'/'STRIP(WORD(realfiles,j))
  179.       IF ~EXISTS(bbspath'FileNotes/'file) THEN
  180.         SAY 'No file description for' file WORD(STATEF(libpath||file),2) 'bytes.'
  181.     END
  182.   END
  183.   notes=SHOWDIR(bbspath'FileNotes/'dirs.i)
  184.   DO j=1 TO WORDS(notes)
  185.     thisnote=bbspath'FileNotes/'dirs.i'/'STRIP(WORD(notes,j))
  186.     x=OPEN(f,thisnote,'R')
  187.     IF x=0 THEN ITERATE j
  188.     line1=READLN(f)
  189.     line2=READLN(f)
  190.     line3=READLN(f)
  191.     CALL CLOSE(f)
  192.     kk=kk+1
  193.     IF ~EXISTS(libpath||dirs.i'/'STRIP(WORD(notes,j))) THEN
  194.       DO
  195.         link=WORD(STATEF(thisnote),8)
  196.         IF link='' THEN ITERATE j
  197.         ELSE
  198.           DO
  199.             IF EXISTS(link) THEN k=k+1
  200.             ELSE ITERATE j
  201.           END
  202.       END
  203.     filenum=WORD(line1,2)
  204.     nname=WORD(line2,2)
  205.     size=WORD(line2,4)
  206.     dlds=WORD(line2,7)
  207.     dirs.i.1=dirs.i.1+1      /*  files this dir */
  208.     dirs.i.2=dirs.i.2+size   /*  bytes this dir */
  209.     dirs.i.3=dirs.i.3+dlds   /* dloads this dir */
  210.     IF size<SMALLEST THEN ITERATE j
  211.     uldate=norm2seq(SUBWORD(line3,4,3))
  212.     IF uldate<19000000 | uldate>99991231 THEN
  213.       DO
  214.         SAY 'Bad Date! 'SUBWORD(line3,4,3) thisnote
  215.         ITERATE j
  216.       END
  217.     IF DATE('I',uldate,'S')>(DATE('I')-MIN_DAYS) THEN ITERATE j
  218.     DO jj=HOW_MANY TO 1 BY -1
  219.       IF dlds>least.jj THEN ITERATE j
  220.       IF dlds=least.jj & uldate>least.jj.0 THEN ITERATE j
  221.       jjj=jj+1
  222.       least.jjj=least.jj
  223.       least.jjj.0=least.jj.0
  224.       least.jjj.1=least.jj.1
  225.       least.jj=dlds
  226.       least.jj.0=uldate
  227.       least.jj.1=RIGHT(size,8) RIGHT(filenum,6) LEFT(dirs.i,16) nname
  228.     END
  229.   END
  230. END
  231.  
  232. SAY kk 'filenotes.'
  233. SAY k 'actual files in libraries.'
  234.  
  235. IF readopen(bbspath'Lists/Files.ALPHA') THEN
  236.   DO
  237.     DO i=1
  238.       line=READLN(f)
  239.       IF EOF(f) THEN BREAK
  240.     END
  241.     CALL CLOSE(f)
  242.   END
  243. SAY i-1 'files listed in ''Lists/Files.ALPHA''.'
  244. SAY
  245. SAY ' - The 'HOW_MANY' least downloaded, oldest files greater -'
  246. SAY ' - than' comma(SMALLEST) 'bytes in the current libraries -'
  247. SAY RIGHT('dls',5) LEFT('Date',11) RIGHT('Bytes',8) 'File #' LEFT('Library',16) 'Filename'
  248. SAY LEFT('-',62,'-')
  249. DO i=1 TO HOW_MANY
  250.   SAY RIGHT(least.i,5) DATE(,least.i.0,'S') least.i.1
  251. END
  252. SAY
  253. SAY ' - LIBRARY STATISTICS -'
  254. SAY RIGHT('Lib#',4) LEFT('Library Name',16) RIGHT('Files',5) RIGHT('Bytes',14) RIGHT('Downloads',9) RIGHT('AverageSize',11) RIGHT('DL/file',7)
  255. SAY LEFT('-',72,'-')
  256. tots.=0
  257. DO i=1 TO 99
  258.   IF dirs.i='' | dirs.i=0 THEN ITERATE i
  259.   DO j=1 TO 3
  260.     tots.j=tots.j+dirs.i.j
  261.   END
  262.   temp=dirs.i.1
  263.   IF temp<1 THEN temp=1
  264.   SAY RIGHT(i,4) LEFT(dirs.i,16) RIGHT(comma(dirs.i.1),5) RIGHT(comma(dirs.i.2),14) RIGHT(comma(dirs.i.3),9) RIGHT(comma((.5+dirs.i.2/temp)%1),11) RIGHT(TRUNC(dirs.i.3/temp,2),7)
  265. END
  266. SAY
  267. SAY LEFT('',21) RIGHT('Files',5) RIGHT('Bytes',14) RIGHT('Downloads',9) RIGHT('AverageSize',11) RIGHT('DL/file',7)
  268. SAY LEFT('-',72,'-')
  269. temp=tots.1
  270. IF temp<1 THEN temp=1
  271. SAY RIGHT('TOTALS:',21) RIGHT(comma(tots.1),5) RIGHT(comma(tots.2),14) RIGHT(comma(tots.3),9) RIGHT(comma((.5+tots.2/temp)%1),11) RIGHT(TRUNC(tots.3/temp,2),7)
  272. SAY
  273. SAY ' - end of filelist report -'
  274.  
  275. IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=name THEN
  276.   CALL SETCLIP('BBS_MESSAGE','FILELISTS_REPORT is waiting in Email.')
  277.  
  278. EXIT(0);
  279.  
  280.  
  281. readopen:
  282. PARSE ARG fname
  283. ok=OPEN(f,fname,'R')
  284. IF ok~=0 THEN RETURN(1)
  285. line=fname 'failed to open for reading!'
  286. SAY line
  287. RETURN(0)
  288.  
  289.  
  290. norm2seq:     /* takes '3 Jan 1990' and turns it into '19900103' */
  291. ARG da' 'mo' 'yr .
  292. da=da/1
  293. mo=STRIP(mo)
  294. yr=yr/1
  295. IF da<10 THEN da='0'da
  296. SELECT
  297.   WHEN mo='JAN' THEN mo='01'
  298.   WHEN mo='FEB' THEN mo='02'
  299.   WHEN mo='MAR' THEN mo='03'
  300.   WHEN mo='APR' THEN mo='04'
  301.   WHEN mo='MAY' THEN mo='05'
  302.   WHEN mo='JUN' THEN mo='06'
  303.   WHEN mo='JUL' THEN mo='07'
  304.   WHEN mo='AUG' THEN mo='08'
  305.   WHEN mo='SEP' THEN mo='09'
  306.   WHEN mo='OCT' THEN mo='10'
  307.   WHEN mo='NOV' THEN mo='11'
  308.   WHEN mo='DEC' THEN mo='12'
  309.   OTHERWISE RETURN(-1);
  310. END
  311. RETURN(yr||mo||da);
  312.  
  313.  
  314. comma:
  315. ARG num .
  316. num=num%1
  317. dgt=LENGTH(num)
  318. numtext=''
  319. IF dgt>3 THEN numtext=','RIGHT(num,3)
  320. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  321. IF dgt>9 THEN
  322.   DO
  323.     numtext=','LEFT(RIGHT(num,9),3)||numtext
  324.     numtext=LEFT(num,dgt-9)||numtext
  325.   END
  326. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  327. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  328. ELSE numtext=num
  329. RETURN(numtext)
  330.  
  331.  
  332. SYNTAX:
  333. FAILURE:
  334. ERROR:
  335. SAY 'Line:' SIGL ERRORTEXT(RC)
  336. SAY
  337. EXIT;
  338.  
  339. /* end of bbsREPORT.rexx */
  340.